// step 1# 定义两个常用宏，分别用于求最小值和最大值
#define MIN(a, b) ((b) < (a) ? (b) : (a))  // 返回 a 和 b 中的较小值
#define MAX(a, b) ((b) > (a) ? (b) : (a))  // 返回 a 和 b 中的较大值

// step 2# 主函数，计算最大能装水的容器面积
int maxArea(int* height, int heightSize) {
    int ans = 0;                        // 用于记录最大面积
    int left = 0;                       // 左指针，初始指向数组开头
    int right = heightSize - 1;        // 右指针，初始指向数组末尾

    // step 3# 使用双指针向中间靠拢，直到相遇
    while (left < right) {
        // step 3.1# 计算当前双指针之间的面积
        int area = (right - left) * MIN(height[left], height[right]);  // 宽 * 高，木桶效应取较短板
        ans = MAX(ans, area);   // step 3.2# 更新最大面积

        // step 3.3# 移动较短板指针，期望找到更高的板增加面积
        height[left] < height[right] ? left++ : right--;  // 若左板较短，左移；否则右移
    }

    // step 4# 返回最大面积
    return ans;
}
